package io.github.annyylxyms.gyn.gateway;

import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * Default GatewayPluginChain.
 */
public class DefaultGatewayPluginChain implements GatewayPluginChain {

    List<GatewayPlugin> plugins;
    int index = 0;

    //通过构造函数传plugins
    public DefaultGatewayPluginChain(List<GatewayPlugin> plugins) {
        this.plugins = plugins;
    }

    @Override
    public Mono<Void> handle(ServerWebExchange exchange) {
        //Mono.defer表示所有东西都是惰性的：不使用 Mono.defer：Mono 在定义时立即创建并缓存结果，后续调用不会重新评估条件，而是直接返回之前的结果。
        //使用 Mono.defer：Mono 在每次订阅时重新评估并创建新的实例，确保每次都基于最新的状态进行处理。
        return Mono.defer(() -> {
            if (index < plugins.size()) {
                //chain传自己
                return plugins.get(index++).handle(exchange, this);
            }
            return Mono.empty();
        });

    }
}
